package cn.iocoder.yudao.module.book.service.checkIn;

import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.book.controller.admin.checkIn.vo.*;
import cn.iocoder.yudao.module.book.controller.app.lock.vo.AppCheckInSaveReqVO;
import cn.iocoder.yudao.module.book.dal.dataobject.checkIn.CheckInDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

/**
 * 打卡 Service 接口
 *
 * @author xi
 */
public interface CheckInService {

    /**
     * 创建打卡
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createCheckIn(@Valid CheckInSaveReqVO createReqVO);

    Integer AppcreateCheckIn(@Valid AppCheckInSaveReqVO createReqVO);

    /**
     * 更新打卡
     *
     * @param updateReqVO 更新信息
     */
    void updateCheckIn(@Valid CheckInSaveReqVO updateReqVO);

    /**
     * 删除打卡
     *
     * @param id 编号
     */
    void deleteCheckIn(Integer id);

    /**
     * 获得打卡
     *
     * @param id 编号
     * @return 打卡
     */
    CheckInDO getCheckIn(Integer id);

    /**
     * 获得打卡分页
     *
     * @param pageReqVO 分页查询
     * @return 打卡分页
     */
    PageResult<CheckInDO> getCheckInPage(CheckInPageReqVO pageReqVO);

    Integer selectDayCount(Long userId);

    CheckInDO selectBook(Long userId, String time);
    
    /**
     * 学习打卡
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createStudyCheckIn(@Valid AppCheckInSaveReqVO createReqVO);
    
    /**
     * 班级打卡
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createClassCheckIn(@Valid AppCheckInSaveReqVO createReqVO);
    
    /**
     * 获取班级打卡记录
     *
     * @param classId 班级ID
     * @param pageReqVO 分页查询
     * @return 打卡分页
     */
    PageResult<CheckInDO> getClassCheckInPage(Integer classId, CheckInPageReqVO pageReqVO);
    
    /**
     * 获取最新打卡记录（所有用户）
     *
     * @param pageReqVO 分页查询
     * @return 打卡分页
     */
    PageResult<CheckInDO> getLatestCheckInPage(CheckInPageReqVO pageReqVO);
    
    /**
     * 获取关注用户的打卡记录
     *
     * @param userIds 用户ID列表
     * @param pageReqVO 分页查询
     * @return 打卡分页
     */
    PageResult<CheckInDO> getFollowingCheckInPage(List<Long> userIds, CheckInPageReqVO pageReqVO);
    
    /**
     * 获取指定用户的打卡记录
     *
     * @param userId 用户ID
     * @param pageReqVO 分页查询
     * @return 打卡分页
     */
    PageResult<CheckInDO> getUserCheckInPage(Long userId, CheckInPageReqVO pageReqVO);
}